home *** CD-ROM | disk | FTP | other *** search
- ; Demo STE
- ; --------
- ; by Martin Backschat, editor of ST-Magazin, Markt&Technik AG, West Germany
- ; ! this demo is public domain !
-
- ; for what: Demo showing the new features of the STE
- ; - horizontical hardware scrolling of 70 lines (4 bitplanes)
- ; - digital sound output (monitor speakers & stereo output)
- ; - all 4096 colors on screen
-
- ; by the way, demo was developped using OMIKRON.ASSEMBLER!
- ; but i think it works fine with different assemblers.
- ; please notice, that no code optimation (branches...) was done, due to
- ; the fact omikron.assembler optimizes automatically.
-
- splitline: EQU 70
-
- TEXT
- ; create 4096 color palette in >mypalette< ------------
- lea calcpal,A1 ; pointer to table 3210->0321 color form
- lea mypalette,A0
-
- move.w #0,D5 ; start with color 000
- move.w #128-1,D7 ; generate 128 lines
- b:
- move.w #32-1,D6 ; 128 lines by 32 COLORS per line
- move.w D5,D0
- a:
- ; transform color 3210 into 0321
- move.w D0,-(SP)
- cmpi.w #16,D6
- bge ok
- move.w D0,D1
- not.w D1
- andi.w #$0F00,D1
- andi.w #$FF,D0
- or.w D1,D0
- addi.w #$80,D0
- ok:
- move.w D0,D2
- andi.w #$0F,D2
- lsl.w #1,D2
- move.w 0(A1,D2.w),D2
- move.w D0,D3
- andi.w #$F0,D3
- lsr.w #3,D3
- move.w 0(A1,D3.w),D3
- lsl.w #4,D3
- add.w D3,D2
- move.w D0,D4
- andi.w #$0F00,D4
- lsr.w #7,D4
- move.w 0(A1,D4.w),D4
- lsl.w #8,D4
- add.w D4,D2
- move.w D2,(A0)+
- move.w (SP)+,D0
-
- addi.w #$0100,D0
- dbra D6,a
- addq.w #1,D5
- dbra D7,b
-
-
- ; system initiation ----------------
-
- clr.l -(SP)
- move.w #$20,-(SP)
- trap #1 ; enter super mode
- lea stack,SP ; my own stack!
- move.l D0,spvi
-
- cmpi.w #$E0,$68 ; Ste or normal ST?
- bne abort ; (using hbl is foul, but it works!)
-
- move.w #4,-(SP)
- trap #14 ; save resolution
- addq.l #2,SP
- cmp.w #2,D0
- beq abort ; not working in monochrome!
- move.w D0,-(SP)
-
- move.w #2,-(SP)
- trap #14
- addq.l #2,SP
- move.l D0,-(SP) ; save screen location
- move.l D0,-(SP)
-
- clr.w -(SP)
- pea -1
- pea -1
- move.w #5,-(SP)
- trap #14 ; enter low res.
- lea 12(SP),SP
- move.w #37,-(SP)
- trap #14 ; make sure we're in lowres
- addq.l #2,SP
-
- ; --- load sound file
-
- clr.w -(SP)
- pea sound
- move.w #$3D,-(SP)
- trap #1
- addq.l #8,SP
- tst.w D0
- bmi abort ; open error -> exit programme
- move.w D0,-(SP)
-
- pea sndstart ; load 122226 of sound file
- pea 122226
- move.w D0,-(SP)
- move.w #$3F,-(SP)
- trap #1
- lea 12(SP),SP
-
- move.w #$3E,-(SP)
- trap #1
- addq.l #4,SP
-
- ; --- load degas elite picture
-
- clr.w -(SP)
- pea muster
- move.w #$3D,-(SP)
- trap #1
- addq.l #8,SP
- tst.w D0
- bmi abort ; open error -> exit programme
- move.w D0,-(SP)
-
- pea picture
- pea 32034
- move.w D0,-(SP)
- move.w #$3F,-(SP)
- trap #1
- lea 12(SP),SP
-
- move.w #$3E,-(SP)
- trap #1
- addq.l #4,SP
-
- ; prepare screen ----------------
-
- lea pic+(splitline*160),A0 ; address of 4096 color screen
- move.l A0,picline69
-
- lea pic,A0
- lea scrollpic,A1 ; screen for double-lined screen
- move.w #splitline-1,D0
- ps0:
- move.w #40-1,D1
- ps1:
- move.l (A0)+,(A1)+
- dbra D1,ps1
- lea -160(A0),A0
- move.w #40-1,D1 ; duplicate each line
- ps2:
- move.l (A0)+,(A1)+
- dbra D1,ps2
- dbra D0,ps0
-
-
- ; feeze system -----------------
-
- move #$2700,SR
-
- lea $FF8240,A0
- lea oldpal,A1
- move.w #15,D0
- savpal:
- move.w (A0)+,(A1)+ ; save old color palette
- dbra D0,savpal
-
- lea $FFFA00,A0
- movep.w $07(A0),D0 ; save enable-register a,b
- movep.w $13(A0),D1 ; save mask-register a,b
- movem.w D0-D1,-(SP)
- move.b #1,$13(A0) ; enable TiB
- clr.b $15(A0)
-
- move.l $70,-(SP)
- move.l #vbl,$70 ; set my own vbl
- move.l #timerb1,$0120 ; set my own TiB-irq (first of 3)
- move.l #mypalette,palptr ; initially point to head of palette
-
- ; ------------ enable digital sound
-
- lea $FF8900,A0
- move.l #sndend,D0
- movep.l D0,$0D(A0)
- move.l #sndstart,D0
- movep.l D0,1(A0)
-
- move.w #$07FF,$24(A0)
- move.w #%10011101000,D0 ; master volume 0 db
- bsr writemw
- move.w #%10101110100,D0 ; left channel 0 db
- bsr writemw
- move.w #%10100110100,D0 ; right channel 0 db
- bsr writemw
- move.w #%10010110000,D0 ; set treble 0 db
- bsr writemw
- move.w #%10001110110,D0 ; set bass 0 db
- bsr writemw
-
- move.w #%10000010,$20(A0) ; mono 25 kHz
- move.w #%11,$00(A0) ; enable loop sound
-
- move #$2300,SR ; enable my work
-
- ; the wait-for-godot do-nothing-routine -------------
-
- wait:
- cmpi.b #$39,$FFFC02 ; wait for SPACE
- bne wait
-
- ; enable system --------------
-
- move #$2700,SR ; hold my work
-
- clr.w $FF8900 ; stop sound
- lea $FF8200,A0
- clr.b $0F(A0) ; clear low byte of screen location
- clr.b $0D(A0) ; clear linewid
- clr.b $65(A0) ; clear hscroll
-
- move.l (SP)+,$70 ; restore vbl
-
- movem.w (SP)+,D0-D1
- lea $FFFA00,A0
- movep.w D0,$07(A0) ; restore mfp-registers
- movep.w D1,$13(A0)
-
- lea oldpal,A0
- lea $FF8240,A1
- move.w #15,D0
- restpal: move.w (A0)+,(A1)+
- dbra D0,restpal ; restore old color palette
-
- move #$2300,SR ; enable system work finally
-
- move.w #5,-(SP)
- trap #14 ; restore resolution
- lea 12(SP),SP
-
- abort:
- move.l spvi,-(SP)
- move.w #$20,-(SP)
- trap #1 ; back to user mode
- clr.w -(SP)
- trap #1 ; quit programm
-
-
- ; ------------ my own vbl
- vbl:
- lea $FF8200,A0
- move.b #80,D3 ; linewid = 80 words
-
- move.l #scrollpic,D0 ; scroll upper part of screen
- move.l offs,D1
- move.w bitoffs,D2
- cmpi.b #16-1,D2
- blo vblscr1
- clr.w D2
- cmp.l #160-8,D1 ; reach end of line?
- bge vblscr1a
- addq.l #8,D1
- bra vblscr2
- vblscr1a:
- clr.l D1
- bra vblscr2
- vblscr1:
- addi.b #1,D2
- subi.b #4,D3
- vblscr2:
- move.b D2,$65(A0)
- move.w D2,bitoffs
- move.b D3,$0F(A0)
- move.l D1,offs
- add.l D1,D0
- movep.l D0,$03(A0)
-
- movem.l picpalette,D0-D7 ; use my own colors in upper part
- movem.l D0-D7,$40(A0)
-
- move.b #1,$FFFA07 ; enable TiB-irq
- clr.b $FFFA1B
- move.b #splitline,$FFFA21 ; countdown 1 line
- move.b #8,$FFFA1B
- move.l #timerb1,$0120 ; reset TiB-irq-pointer
-
- move.l #mypalette,palptr ; initialize palptr for TiB-irq
- rte
-
- ; ------------ my own TiB-irq
- timerb1:
- lea $FF8200,A0
- clr.b $0F(A0) ; linewid = 0 words
- clr.b $65(A0) ; hscroll = 0
- move.l picline69,D0 ; set screen location
- movep.l D0,$03(A0)
- ss:
- move.l #timerb2,$0120 ; set pointer to routine II
- clr.b $FFFA1B
- move.b #1,$FFFA21 ; wait for 1 line
- move.b #8,$FFFA1B
- bclr #0,$FFFA0F ; serve TiB in
- rte
-
- timerb2:
- movea.l palptr,A5
- lea $FF8242,A6
- move.l (A5)+,(A6)+ ; write 32 colors (15+15+2)
- move.l (A5)+,(A6)+
- move.l (A5)+,(A6)+
- move.l (A5)+,(A6)+
- move.l (A5)+,(A6)+
- move.l (A5)+,(A6)+
- move.l (A5)+,(A6)+
- move.w (A5)+,(A6)+
- lea $FF8242,A6
- move.l (A5)+,(A6)+
- move.l (A5)+,(A6)+
- move.l (A5)+,(A6)+
- move.l (A5)+,(A6)+
- move.l (A5)+,(A6)+
- move.l (A5)+,(A6)+
- move.l (A5)+,(A6)+
- move.w (A5)+,(A6)
- move.l (A5)+,$FF8242
- move.l A5,palptr
- bclr #0,$FFFA0F
- rte
-
- ; subroutine for writing data into microwire-interface
- writemw:
- cmpi.w #$07FF,$FF8924
- bne writemw
- move.w D0,$FF8922
- rts
-
-
- ; ------------ DATA STORAGE
- DATA
- muster:
- DC.B "stedemo.pi1",0
- sound:
- DC.B "stedemo.snd",0
- EVEN
-
- calcpal:
- DC.W 0,%1000,%1,%1001,%10
- DC.W %1010,%11,%1011
- DC.W %100,%1100,%101
- DC.W %1101,%110,%1110,%111,%1111
-
- rainbow:
- DC.W $0432,$0543,$0654,$0765
- DC.W $20,$40,$50,$70,$05,$07
- DC.W 0,0,0,0,0
- DC.W $0432,$0543,$0654,$0765
- DC.W $20,$40,$50,$70,$05,$07
- DC.W 0,0,0,0,0
- DC.W $0432,$0543
-
- ; ------------ RANDOM DATA STORAGE
- BSS
- spvi:
- DS.L 1
- palptr:
- DS.L 1
- oldpal:
- DS.L 16 ; Original color palette
-
- picline69:
- DS.L 1
- offs:
- DS.L 1
- bitoffs:
- DS.W 1
-
- picture:
- DS.W 1
- picpalette:
- DS.W 16
- pic:
- DS.B 32000
-
- DS.L 256
- stack:
-
- mypalette:
- DS.W 4096
- scrollpic:
- DS.B splitline*160*2 ; double width
- sndstart:
- DS.W 122226/2
- sndend:
-
- END
-